﻿/*
# Copyright 2011-2012 Dylan Cochran
# All rights reserved
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted providing that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using SimpleMesh.Service.AppProtocol;

namespace SimpleMesh.Service
{
    public partial class Trackfile
    {
        private Thread _ReceiveThread;

        public Thread ReceiveThread
        {
            get { return _ReceiveThread; }
            set { _ReceiveThread = value; }
        }
        public void Receive()
        {
            this.ReceiveThread = new Thread(new ThreadStart(this.ReceiveWorker));
            this.ReceiveThread.Start();
        }
        public void ReceiveWorker()
        {
            List<Socket> ReadList;
            bool end = false;
            while (end == false)
            {
                ReadList = new List<Socket>();
                foreach (KeyValuePair<string, Node> node in this.NodeList)
                {
                    lock (node.Value)
                    {
                        foreach (IConnection conn in node.Value.Connections)
                        {
                            if (conn != null)
                            {
                                lock (conn)
                                {
                                    if (conn.Vampire == false)
                                    {
                                        ReadList.Add(conn.Socket);
                                    }
                                }
                            }
                        }
                    }
                }
                if (ReadList.Count == 0)
                {
                    Thread.Sleep(500);
                    continue;
                }
                Socket.Select(ReadList, null, null, 1000);
                foreach (Socket sock in ReadList)
                {
                    foreach (KeyValuePair<string, Node> node in this.NodeList)
                    {
                        
                        IConnection realconn = null;
                        lock (node.Value)
                        {
                            foreach (IConnection conn in node.Value.Connections)
                            {
                                if (conn.Socket == sock)
                                {
                                    realconn = conn;
                                }
                            }
                        }
                        if (realconn != null)
                        {
                            try
                            {
                                Receiver((object) realconn);
                            }
                            catch
                            {
                            }
                        }
                    }
                }
            }
        }
        public void Receiver(object obj)
        {
            IConnection conn = (IConnection)obj;
            IMessage message;
             message = conn.Receive(false);
           
        }
    }
}
